package cn.iocoder.yudao.module.trade.service.order.handler;

import cn.iocoder.yudao.framework.common.enums.trade.TradeOrderStatusEnum;
import cn.iocoder.yudao.module.member.api.config.dto.MemberConfMaterialDTO;
import cn.iocoder.yudao.module.member.api.config.dto.MemberConfRespDTO;
import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO;
import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderOrderCreateReqVO;
import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderOrderReqVO;
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;

/**
 * 交易模式处理器接口
 */
public interface TransactionModeHandler {
    
    /**
     * 获取交易模式类型
     */
    Integer getTransactionType();
    
    /**
     * 校验交易权限
     */
    void validatePermission(MemberConfRespDTO memberConf);
    
    /**
     * 校验金属配置
     */
    MemberConfMaterialDTO validateAndGetMaterialConf(MemberConfRespDTO memberConf, Integer metalType, Integer transactionType);
    
    /**
     * 校验交易限制
     */
    void validateTradeLimits(MemberConfMaterialDTO materialConf, AppTradeOrderOrderReqVO settlementReqVO);


    
    /**
     * 计算订单价格
     * 
     * @param calculateReqBO 计算请求
     * @return 计算结果
     */
    TradePriceCalculateRespBO calculatePrice(TradePriceCalculateReqBO calculateReqBO);

    /**
     * 获取下一个订单状态
     *
     * @param order   订单
     * @param payType 支付类型
     * @param isStore
     * @return 下一个订单状态
     */
    TradeOrderStatusEnum getNextStatusBySuceess(TradeOrderDO order, Integer payType, Boolean isStore);

    /**
     * 设置订单发货信息
     * 
     * @param order 订单
     * @param userId 用户ID
     * @param createReqVO 创建请求
     */
    void setupDeliveryInfo(TradeOrderDO order, Long userId, AppTradeOrderOrderCreateReqVO createReqVO);

    /**
     * 创建结算单
     * 
     * @param order 订单
     * @param isViolate 是否违约
     * @return 结算单
     */
    PayOrderCreateReqDTO creatSettlePay(TradeOrderDO order, Boolean isViolate);
}